From 2831dbb110f9a740c473805b705b61c646819535 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sun, 2 Dec 2018 09:05:50 +0100 Subject: [PATCH] gl renderer: Refactor add_offscreen_ops Use a graphene_rect_t for the node bounds instead of 4 floats. This makes it simpler to pass the size in without the offset applied. --- gsk/gl/gskglrenderer.c | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index d6bc6ca8da..40b601fe90 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -246,16 +246,13 @@ node_supports_transform (GskRenderNode *node) static void gsk_gl_renderer_setup_render_mode (GskGLRenderer *self); static void add_offscreen_ops (GskGLRenderer *self, - RenderOpBuilder *builder, - float min_x, - float max_x, - float min_y, - float max_y, - GskRenderNode *child_node, - int *texture_id, - gboolean *is_offscreen, - gboolean force_offscreen, - gboolean reset_clip); + RenderOpBuilder *builder, + const graphene_rect_t *bounds, + GskRenderNode *child_node, + int *texture_id, + gboolean *is_offscreen, + gboolean force_offscreen, + gboolean reset_clip); static void gsk_gl_renderer_add_render_ops (GskGLRenderer *self, GskRenderNode *node, RenderOpBuilder *builder); @@ -790,7 +787,7 @@ render_transform_node (GskGLRenderer *self, * for the texture. */ add_offscreen_ops (self, builder, - min_x, max_x, min_y, max_y, + &node->bounds, child, &texture_id, &is_offscreen, FALSE, TRUE); @@ -934,7 +931,7 @@ render_rounded_clip_node (GskGLRenderer *self, } prev_clip = ops_set_clip (builder, &child_clip); - add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, + add_offscreen_ops (self, builder, &node->bounds, child, &texture_id, &is_offscreen, TRUE, FALSE); @@ -970,10 +967,7 @@ render_color_matrix_node (GskGLRenderer *self, /* Pass min_x/max_x/min_y/max_y without builder->dx/dy! */ add_offscreen_ops (self, builder, - node->bounds.origin.x, - node->bounds.origin.x + node->bounds.size.width, - node->bounds.origin.y, - node->bounds.origin.y + node->bounds.size.height, + &node->bounds, gsk_color_matrix_node_get_child (node), &texture_id, &is_offscreen, FALSE, TRUE); @@ -1017,7 +1011,8 @@ render_blur_node (GskGLRenderer *self, int texture_id; gboolean is_offscreen; RenderOp op; - add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, + add_offscreen_ops (self, builder, + &node->bounds, gsk_blur_node_get_child (node), &texture_id, &is_offscreen, FALSE, TRUE); @@ -1535,7 +1530,7 @@ render_shadow_node (GskGLRenderer *self, /* Draw the child offscreen, without the offset. */ add_offscreen_ops (self, builder, - min_x, max_x, min_y, max_y, + &shadow_child->bounds, shadow_child, &texture_id, &is_offscreen, FALSE, TRUE); ops_offset (builder, dx, dy); @@ -1583,8 +1578,8 @@ render_cross_fade_node (GskGLRenderer *self, GskRenderNode *node, RenderOpBuilder *builder) { - const float min_x = node->bounds.origin.x; - const float min_y = node->bounds.origin.y; + const float min_x = builder->dx + node->bounds.origin.x; + const float min_y = builder->dy + node->bounds.origin.y; const float max_x = min_x + node->bounds.size.width; const float max_y = min_y + node->bounds.size.height; GskRenderNode *start_node = gsk_cross_fade_node_get_start_child (node); @@ -1607,10 +1602,14 @@ render_cross_fade_node (GskGLRenderer *self, /* TODO: We create 2 textures here as big as the cross-fade node, but both the * start and the end node might be a lot smaller than that. */ - add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, start_node, + add_offscreen_ops (self, builder, + &node->bounds, + start_node, &start_texture_id, &is_offscreen1, TRUE, TRUE); - add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, end_node, + add_offscreen_ops (self, builder, + &node->bounds, + end_node, &end_texture_id, &is_offscreen2, TRUE, TRUE); ops_set_program (builder, &self->cross_fade_program); @@ -2314,21 +2313,18 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self, } static void -add_offscreen_ops (GskGLRenderer *self, - RenderOpBuilder *builder, - float min_x, - float max_x, - float min_y, - float max_y, - GskRenderNode *child_node, - int *texture_id_out, - gboolean *is_offscreen, - gboolean force_offscreen, - gboolean reset_clip) +add_offscreen_ops (GskGLRenderer *self, + RenderOpBuilder *builder, + const graphene_rect_t *bounds, + GskRenderNode *child_node, + int *texture_id_out, + gboolean *is_offscreen, + gboolean force_offscreen, + gboolean reset_clip) { const float scale = ops_get_scale (builder); - const float width = (max_x - min_x) * scale; - const float height = (max_y - min_y) * scale; + const float width = bounds->size.width * scale; + const float height = bounds->size.height * scale; const float dx = builder->dx; const float dy = builder->dy; int render_target; @@ -2377,8 +2373,10 @@ add_offscreen_ops (GskGLRenderer *self, render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, TRUE, TRUE); graphene_matrix_init_ortho (&item_proj, - min_x * scale, max_x * scale, - min_y * scale, max_y * scale, + bounds->origin.x * scale, + (bounds->origin.x + bounds->size.width) * scale, + bounds->origin.y * scale, + (bounds->origin.y + bounds->size.height) * scale, ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE); graphene_matrix_scale (&item_proj, 1, -1, 1); graphene_matrix_init_identity (&identity); @@ -2390,14 +2388,16 @@ add_offscreen_ops (GskGLRenderer *self, ops_add (builder, &op); prev_projection = ops_set_projection (builder, &item_proj); ops_push_modelview (builder, &identity); - prev_viewport = ops_set_viewport (builder, &GRAPHENE_RECT_INIT (min_x * scale, - min_y * scale, - width, height)); + prev_viewport = ops_set_viewport (builder, + &GRAPHENE_RECT_INIT (bounds->origin.x * scale, + bounds->origin.y * scale, + width, height)); if (reset_clip) prev_clip = ops_set_clip (builder, - &GSK_ROUNDED_RECT_INIT (min_x * scale, - min_y * scale, + &GSK_ROUNDED_RECT_INIT (bounds->origin.x * scale, + bounds->origin.y * scale, width, height)); + builder->dx = 0; builder->dy = 0; -- 2.30.2